<?php

declare (strict_types=1);
/**
 * @copyright 深圳市易果网络科技有限公司
 * @version 1.0.0
 * @link https://dayiguo.com
 */

namespace App\Dao;

use App\Model\UserAddr;

/**
 * 用户地址 Dao
 *
 * @author 谢声强(861167322@qq.com)
 * @package App\Dao
 */
class UserAddrDao extends Dao
{
    /**
     * 地址列表
     *
     * @return mixed
     */
    public function list()
    {
        $addr_list = UserAddr::query()->where('user_id', uid())
            ->select('id', 'name', 'phone', 'province', 'city', 'district', 'area_id', 'address', 'zip_code', 'remark', 'is_default')
            ->orderByDesc('is_default')
            ->get();
        $tag = 0;
        foreach ( $addr_list as $key => $value ) {
            if( $value['is_default'] == 1 ) {
                $tag = 1;
            }

            if( $tag == 0 ) {
                $addr_list[0]['is_default'] = 1;
            }
        }

        return $addr_list;
    }

    /**
     * 创建地址
     *
     * @param array $data
     * @return mixed
     */
    public function create(array $data)
    {
        if (isset($data['is_default']) && $data['is_default'] === 1) {
            UserAddr::query()->where('user_id', uid())->update(['is_default' => 0]);
        }

        return UserAddr::query()->create($data);
    }

    /**
     * 编辑地址
     *
     * @param int $id 地址ID
     * @param array $data 更新数据
     * @return mixed
     */
    public function update(int $id, array $data)
    {
        $user_id = uid();

        if (isset($data['is_default']) && $data['is_default'] === 1) {
            UserAddr::query()->where('user_id', $user_id)->update(['is_default' => 0]);
        }

        return UserAddr::query()->where('id', $id)->where('user_id', $user_id)->update($data);
    }

    /**
     * 删除地址
     *
     * @param int $id 收货地址ID
     * @return mixed
     */
    public function delete(int $id)
    {
        return UserAddr::query()->where('id', $id)->where('user_id', uid())->delete();
    }

    /**
     * 根据地址 id 查出地址
     *
     * @param int $id
     * @param boolean $abnormal
     * @return mixed
     */
    public function first(int $id, bool $abnormal = true)
    {
        $data = UserAddr::query()->where('user_id', uid())->where('id', $id)->first();

        if (!$data && $abnormal === true) {
            $this->error('USER_ADDR.NOT_EXIST');
        }

        return $data;
    }
}